package Componentes;

import Graficos.*;
import Juegos.*;
import Logica.*;

/**
 * ProyectoX TDP 2011
 * @author  Ma Gimena Ramos- LU:82716
 * @autor Brenda Dilschneider- LU: 92774
 *
 */
public  abstract class Componente extends Contenedor implements Cloneable {

	//Atributos de instancia
	char cod;
	protected ComponenteGrafico comp;
	protected Posicion pos;
	protected int puntaje;
	protected Posicion posicionGrafica;
	protected boolean destruido;
	protected Gravedad gravedad;
	protected boolean visible;
	protected boolean transitable;
	protected Personaje mario;
	protected boolean pm;
	
	/**
	 * constructor protegido con parametros
	 * @param p partida 
	 */
	protected Componente(Partida p)
	{   visible = false;
		pos=new Posicion();
		destruido=false;
		gravedad=new Gravedad(p);
		transitable=false;
		pm=false;
	}
	
	/**
	 * constructor protegido sin parametro
	 */
	protected Componente()
	{   visible = false;
		pos=new Posicion();
		cod=' ';
		destruido=false;
		pm=false;
	}

	
	
	/**
	 * asiga un componente grafico c al componente
	 * @param c
	 */
	public void setGrafico(ComponenteGrafico c){
		comp=c;
		
	}
	/**
	 * retorna la posicion del componente
	 * @return pos
	 */
	public Posicion obtenerPosicion(){
		return pos;
	}
	
	/**
	 * asigna una posicion al objeto mediante los parametro x,y
	 * @param x valor de la posicion en X
	 * @param y valor de la posicion en y
	 */
	public void setPosicion(int x, int y){
		pos.setPosicion(x, y);
	}
	
	
	
	
	/**
	 * clona el componente
	 * @return clon del objeto
	 */
	public Object clonar()
	{
		try {
			return this.clone();
		} catch (CloneNotSupportedException e) {
			return null;
		}
	}
	
	/**
	 * retorna la gravedad del componente
	 * @return gravedad
	 */
	public Gravedad obtenerGravedad(){
		return gravedad;
	}
	
		/**
		 * retorna el componente grafico asignado al componente
		 * @return componente grafico
		 */
	public ComponenteGrafico getGrafico()
	{
		return comp;
	}
	
	/**
	 * controla si el objeto esta destruido
	 * @return true si esta destruido, false en caso contrario
	 */
	public boolean destruido(){
		return destruido;
	}

	/**
	 * metodo abstracto
	 */
	public abstract void chocarMario();

	/**
	 * metodo abstracto
	 */
	public abstract void arrancarHilo();
	
	/**
	 * asigna el parametro gravedad al componente
	 * @param gravedad del componente
	 */
	public void setGravedad( Gravedad gra){
	 gravedad = gra;
	}
	
	/**
	 * controla que el componente sea visible
	 * @return true si es visible, false en caso contrario
	 */
	public boolean esVisible(){
		return visible;
	}
	
	/**
	 * controla que el componente sea transitable
	 * @return true si el componente es transitable, false en caso contrario
	 */
	public boolean esTransitable(){
		return transitable;
	}
	
	/**
	 * retorna el puntaje del componente
	 * @return puntaje del componente
	 */
	public int obtenerPuntaje(){
		return puntaje;
	}
	
	/**
	 * metodo abstracto
	 */
	public abstract void pisadoPorMario();
	
	/**
	 * metodo abstracto
	 */
public abstract void destruirHilo();

/**
 * metodo abstracto
 */
public abstract void serChocado();

/**
 * metodo abstracto
 */
public abstract void serChocado(Componente c);

/**
 * asigna un personaje pasado por parametro al componente
 * @param personaje a asignar
 */
public void setPersonaje(Personaje personaje) {
	this.mario=personaje;
	}

/**
 * controla si es un malo
 * @return true si es malo, false en caso contrario
 */
public boolean obtenerPM(){
	return pm;
}


} 
